<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.2.2" />
<style type="text/css">
/* Debug borders */
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
/*
  border: 1px solid red;
*/
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
}

strong {
  font-weight: bold;
}

tt {
  color: navy;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  font-family: sans-serif;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1 {
  border-bottom: 2px solid silver;
}
h2 {
  border-bottom: 2px solid silver;
  padding-top: 0.5em;
}

div.sectionbody {
  font-family: serif;
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

pre {
  padding: 0;
  margin: 0;
}

span#author {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  font-size: 1.1em;
}
span#email {
}
span#revision {
  font-family: sans-serif;
}

div#footer {
  font-family: sans-serif;
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
div#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
div#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

div#preamble,
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-right: 10%;
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.5em;
  margin-bottom: 2.5em;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  font-family: sans-serif;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}

div.listingblock {
  margin-right: 0%;
}
div.listingblock > div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock > div.content {
  padding-left: 2.0em;
}

div.attribution {
  text-align: right;
}
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 2px solid silver;
}

div.exampleblock > div.content {
  border-left: 2px solid silver;
  padding: 0.5em;
}

div.verseblock div.content {
  white-space: pre;
}

div.imageblock div.content { padding-left: 0; }
div.imageblock img { border: 1px solid silver; }
span.image img { border-style: none; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: italic;
}
dd > *:first-child {
  margin-top: 0;
}

ul, ol {
    list-style-position: outside;
}
ol.olist2 {
  list-style-type: lower-alpha;
}

div.tableblock > table {
  border: 3px solid #527bbd;
}
thead {
  font-family: sans-serif;
  font-weight: bold;
}
tfoot {
  font-weight: bold;
}

div.hlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hlist td {
  padding-bottom: 5px;
}
td.hlist1 {
  vertical-align: top;
  font-style: italic;
  padding-right: 0.8em;
}
td.hlist2 {
  vertical-align: top;
}

@media print {
  div#footer-badges { display: none; }
}

div#toctitle {
  color: #527bbd;
  font-family: sans-serif;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}
/* Workarounds for IE6's broken and incomplete CSS2. */

div.sidebar-content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}
div.sidebar-title, div.image-title {
  font-family: sans-serif;
  font-weight: bold;
  margin-top: 0.0em;
  margin-bottom: 0.5em;
}

div.listingblock div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock-content {
  padding-left: 2.0em;
}

div.exampleblock-content {
  border-left: 2px solid silver;
  padding-left: 0.5em;
}

/* IE6 sets dynamically generated links as visited. */
div#toc a:visited { color: blue; }
</style>
<script type="text/javascript">
/*<![CDATA[*/
window.onload = function(){generateToc(2)}
/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4.sp
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, October 2006. License: GPL */
 /* modified by Shawn Pearce, August 2009. License: GPL */

function getText(el) {
  var text = "";
  for (var i = el.firstChild; i != null; i = i.nextSibling) {
    if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
      text += i.data;
    else if (i.firstChild != null)
      text += getText(i);
  }
  return text;
}

function TocEntry(el, text, toclevel) {
  this.element = el;
  this.text = text;
  this.toclevel = toclevel;
  this.assigned = false;

  if (el.id != '') {
    this.id = el.id;

  } else {
    var a = el.firstChild;
    if ((a.tagName == "a" || a.tagName == "A") && a.id != "") {
      this.id = a.id;
    } else {
      this.id = '';
    }
  }
}

function tocEntries(el, toclevels) {
  var result = new Array;
  var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
  // Function that scans the DOM tree for header elements (the DOM2
  // nodeIterator API would be a better technique but not supported by all
  // browsers).
  var iterate = function (el) {
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
        var mo = re.exec(i.tagName)
        if (mo)
          result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
        iterate(i);
      }
    }
  }
  iterate(el);
  return result;
}

// This function does the work. toclevels = 1..4.
function generateToc(toclevels) {
  var simple_re = new RegExp('^[a-zA-Z._ -]{1,}$');
  var entries = tocEntries(document.getElementsByTagName("body")[0], toclevels);
  var usedIds = new Array();

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id != "")
      usedIds[entry.id] = entry;
  }

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id != "" || !simple_re.exec(entry.text))
      continue;

    var n = entry.text.replace(/ /g, '_').toLowerCase();
    var e = usedIds[n];
    if (e) {
      if (e.assigned)
        e.id = '';
      continue;
    }

    entry.assigned = true;
    entry.id = n;
    entry.element.id = entry.id;
    usedIds[n] = entry;
  }

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id == '') {
      entry.id = "toc" + i;
      entry.element.id = entry.id;
    }
  }

  var toc = document.getElementById("toc");
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    var a = document.createElement("a");
    a.href = "#" + entry.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
}
/*]]>*/
</script>
<title>Gerrit Code Review - J2EE Installation</title>
</head>
<body>
<div id="header">
<h1>Gerrit Code Review - J2EE Installation</h1>
<span id="revision">version v2.1.1.1</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<h2>Description</h2>
<div class="sectionbody">
<p>Gerrit binary distributions include a standalone Jetty servlet
container, but are packaged as a standard WAR file to permit easy
deployment to other existing container installations if using the
standalone daemon is not desired.</p>
<p>Gerrit Code Review can be installed into any J2EE servlet container,
including popular open source containers such as Jetty or Tomcat, or
any commerical server which supports the J2EE servlet specification.</p>
</div>
<h2>Installation</h2>
<div class="sectionbody">
<ul>
<li>
<p>
Complete the <a href="install.html#createdb">database setup</a> and
  <a href="install.html#init">site initialization</a> tasks described
  in the standard installation documentation.
</p>
</li>
<li>
<p>
Stop the embedded deamon that was automatically started by <em>init</em>:
</p>
<div class="listingblock">
<div class="content">
<pre><tt>  review_site/bin/gerrit.sh stop</tt></pre>
</div></div>
</li>
<li>
<p>
Deploy the <em>gerrit.war</em> file to your application server.
</p>
<p>The deployment process differs between servers, but typically this
can be accomplished by copying <em>gerrit.war</em> into the <em>webapps/</em>
subdirectory of the container's installation.</p>
</li>
<li>
<p>
Configure JNDI DataSource <em>jdbc/ReviewDb</em>.
</p>
<p>This DataSource must point to the database you created above.
Don't forget to ensure your JNDI configuration can load the
necessary JDBC drivers.  You may wish to ensure connection pooling
is configured and enabled within the DataSource.</p>
</li>
<li>
<p>
(<em>Optional</em>) Install Bouncy Castle Crypto API
</p>
<p>If you enabled Bouncy Castle Crypto during <em>init</em>, copy the JAR
from <tt><em>$site_path</em>/lib</tt> into your servlet container's extensions
directory so its available to Gerrit Code Review.</p>
</li>
</ul>
</div>
<h2>Jetty 7.x</h2>
<div class="sectionbody">
<p>These directions will configure Gerrit as the default web
application, allowing URLs like <tt>http://example.com/4543</tt> to jump
directly to change 4543.</p>
<p>Download and unzip a release version of Jetty.  From here on we
call the unpacked directory <tt>$JETTY_HOME</tt>.</p>
<ul>
<li>
<p>
<a href="http://www.eclipse.org/jetty/downloads.php">Jetty Downloads</a>
</p>
</li>
</ul>
<p>If this is a fresh installation of Jetty, move into the installation
directory and do some cleanup to remove the sample webapps:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  cd $JETTY_HOME
  rm -rf contexts/* webapps/*</tt></pre>
</div></div>
<p>Copy Gerrit Code Review into the deployment:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  cp ~/gerrit.war webapps/gerrit.war
  java -jar webapps/gerrit.war cat extra/jetty7/gerrit.xml &gt;contexts/gerrit.xml</tt></pre>
</div></div>
<p>Install the required additional libraries by copying them into the
<tt><em>$JETTY_HOME</em>/lib/ext</tt> directory:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  cp ../review_db/lib/* lib/ext/
  java -jar webapps/gerrit.war cat lib/commons-dbcp-1.2.2.jar &gt;lib/ext/commons-dbcp-1.2.2.jar
  java -jar webapps/gerrit.war cat lib/commons-pool-1.5.3.jar &gt;lib/ext/commons-pool-1.5.3.jar
  java -jar webapps/gerrit.war cat lib/h2-1.2.122.jar &gt;lib/ext/h2-1.2.122.jar
  java -jar webapps/gerrit.war cat lib/postgresql-8.4-701.jdbc4.jar &gt;lib/ext/postgresql-8.4-701.jdbc4.jar</tt></pre>
</div></div>
<p>Edit <tt><em>$JETTY_HOME</em>/contexts/gerrit.xml</tt> to correctly configure
the database and outgoing SMTP connections, especially the user
and password fields.</p>
<p>If OpenID authentication (or certain enterprise single-sign-on
solutions) is being used, you may need to increase the
header buffer size parameter, due to very long header lines
being used by the OpenID authentication handshake process.
Add the following to <tt><em>$JETTY_HOME</em>/etc/jetty.xml</tt> under
<tt>org.eclipse.jetty.server.nio.SelectChannelConnector</tt>:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  &lt;Set name="headerBufferSize"&gt;16384&lt;/Set&gt;</tt></pre>
</div></div>
<p>To start automatically when the system boots, create a start
script and modify it for your configuration:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  java -jar webapps/gerrit.war --cat extra/jetty7/gerrit-jetty.sh &gt;/etc/init.d/gerrit-jetty.sh
  vi /etc/init.d/gerrit-jetty.sh</tt></pre>
</div></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">Under Jetty, restarting the web application (e.g. after modifying
<tt>system_config</tt>) is as simple as touching the context config file:
<tt><em>$JETTY_HOME</em>/contexts/gerrit.xml</tt></td>
</tr></table>
</div>
</div>
<hr style="
  height: 2px;
  color: silver;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
">
<p>Part of <a href="index.html">Gerrit Code Review</a></p>
<div id="footer">
<div id="footer-text">
Version v2.1.1.1<br />
Last updated 11-Jan-2010 08:57:22 PDT
</div>
</div>
</body>
</html>
